<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // const 一旦定义为常量则不能更改
        /**
         * 1、const 一旦定义为常量则不能更改
         * 2、不能重复申明相同的变量
         * 3、无声明前置（无预解析）
         * 4、const声明的变量不会挂载在window上
         * 5、有块级作用域
         */
        const a = 10;
        // a = 20;
        // console.log(a);// 报错
        // const a = 30

        // console.log(b);
        // const b = 20;

        // const c = 40;
        // console.log(window.c);// undefined

        // {
        //     const d = 10;
        // }
        // console.log(d);

        // const 定义的对象
        // const obj = {
        //     name: '张三',
        //     age: 18
        // }
        /**
         *  直接改变对象的引用，重新赋值新对象不可以
         *  但是可以通过对象的属性改变值
         *  终极方法: 冻结对象
         */
         
        // const = {
        //     name: '李四'
        // }
        // obj.name = '李四';

        // 冻结对象,只能冻结浅层的对象
        // Object.freeze(obj);
        // obj.name = '李四';
        // console.log(obj);

        // 冻结多层对象
        const obj = {
            name: '张三',
            age: 18,
            hobby: {
                name1: '篮球'
            }
        }
        // Object.freeze(obj);
        // obj.hobby.name1 = '排球';
        // console.log(obj);

        function objFreeze(obj) {
            for(var key in obj) {
                if (typeof obj[key] === 'object') {
                    objFreeze(obj[key]);
                } else {
                    Object.freeze(obj);
                }
            }
        }
        objFreeze(obj);
        obj.hobby.name1 = '排球';
        console.log(obj);
    </script>
</body>
</html>